/**
 * Stack.java
 * @author Algoritmos y Estructura de Datos
 * @since 12/07/2012
 * @param <E> Genérico para indicar el tipo de objeto que almacenará la pila.
 * Descripción: Interfaz de la estructura de datos "pila".
 */
public interface Stack <E> {

    /**
     * Permite almacenar un objeto en la pila.
     * Pre-Condiciones: No hay.
     * Post-Condiciones: El objeto es añadido a la pila y será el siguiente en
     * ser sacado si no se inserta otro elemento en la pila.
     * @param item Objeto colocado dentro de la pila.
     */
    public void push(E item);

   /**
     * Permite extraer el último objeto de la pila.
     * Pre-Condiciones: La pila no está vacía.
     * Post-Condiciones: El último objeto insertado en la pila es removido de
     *                   esta y devuelta al usuario.
     * @return Objeto almacenado en la pila del tipo asignado a esta.
     */
   public E pop();
   
   /**
    * Permite ver el objeto que está en la cima de la pila sin removerlo de esta.
    * Pre-Condiciones: La pila no está vacía.
    * Post-Condiciones: El valor de la cima de la pila es retornado.
    * @return Objeto almacenado en la cima de la pila.
    */
   public E peek();
   
   /**
    * Permite saber si la pila está vacía o no.
    * Pre-condiciones: No hay.
    * Post-condiciones: Devuelve verdadero si y solo si la pila está vacía.
    * @return boolean true si la pila está vacía; false en caso contrario.
    */
   public boolean empty();
   
   /**
    * Permite conocer el tamaño actual de la pila.
    * Pre-Condiciones: No hay.
    * Post-Condiciones: Se devuelve el número de elementos en la pila.
    * @return int Número de elementos en la pila.
    */   
   public int size();

}